package cn.com.jenson.common;

import com.querydsl.core.types.dsl.BooleanExpression;
import org.springframework.data.domain.Page;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * BasicService <br>
 * 用于继承<br>
 *
 * @param <V>  Vo
 * @param <B>  Bo
 * @param <SB> SearchBo
 */
public interface BasicService<V, B, SB> {
    /**
     * 获取分页数据
     *
     * @param sb 分页条件
     * @return 分页数据
     */
    Page<V> pageAll(SB sb);

    /**
     * 获取数据
     *
     * @param sb 条件
     * @return 数据
     */
    List<V> listAll(SB sb);

    /**
     * 获取 数据
     *
     * @param sb 条件
     * @return 数据
     */
    V get(SB sb) throws InstantiationException, IllegalAccessException;

    /**
     * 获取where条件
     *
     * @param sb 条件
     * @return where条件
     */
    BooleanExpression getWhere(SB sb);

    /**
     * 新增 / 修改 数据
     *
     * @param b 要新增/修改的数据
     * @return 新增/修改后的数据
     */
    V edit(B b) throws InstantiationException, IllegalAccessException;

    /**
     * 新增 / 修改 数据
     *
     * @param bList 要新增/修改的数据集合
     * @return 新增/修改后的数据集合
     */
    List<V> editAll(List<B> bList);

    /**
     * 删除数据
     *
     * @param sb 删除条件
     * @return 删除结果
     */
    V deleted(SB sb) throws InstantiationException, IllegalAccessException;

    /**
     * 删除数据
     *
     * @param sbList 删除 条件集合
     * @return 删除结果集合
     */
    List<V> deletedAll(List<SB> sbList);


    /**
     * 获取导入模板 配置
     *
     * @return 导入模板 配置
     */
    List<ImportVerifierVo> importTemplateVerifiers();

    /**
     *  导入模板
     * @param userBos 导入模板 配置
     * @return 导入模板 配置
     */
//    @Deprecated
//    @PostMapping("/import_from_template")
//    Result<List<UserVo>> importFromTemplate(@RequestBody List<UserBo> userBos);


    /**
     * 导入模板下载
     *
     * @param response response
     * @throws IOException IOException
     */
    void importTemplateDownload(HttpServletResponse response) throws IOException;

    /**
     * 获取筛选项
     *
     * @return 筛选项
     */
    List<SelectVo<String, Integer, V>> option();

    void supplement(V v);
    void supplement(List<V> vList);

    void supplement(Page<V> vPage);
}
